home *** CD-ROM | disk | FTP | other *** search
/ Die Speccy' 97 / Die Speccy' 97.iso / amiga_system / the_aminet / util / moni / msfu_v11.lha / MSFU / src / Trace.e < prev   
Text File  |  1995-09-05  |  12KB  |  380 lines

  1. OPT MODULE
  2.  
  3.  
  4. ->/////////////////////////////////////////////////////////////////////////////
  5. ->//////////////////////////////////////////////////////////// MODULE ... /////
  6. ->/////////////////////////////////////////////////////////////////////////////
  7. MODULE 'exec/lists' , 'exec/nodes' , 'exec/execbase' , 'exec/libraries'
  8. MODULE 'dos/dos' , 'dos/datetime' , 'dos/rdargs'
  9. MODULE 'tools/minconstructors' , 'tools/file'
  10.  
  11. MODULE '*SystemFiles'
  12.  
  13.  
  14. ->/////////////////////////////////////////////////////////////////////////////
  15. ->//////////////////////////////////////////////// RAISE ... IF ... = ... /////
  16. ->/////////////////////////////////////////////////////////////////////////////
  17. RAISE    "MEM"    IF    String()            =    NIL    ,
  18.         "MEM"    IF    AllocDosObject()    =    NIL    ,
  19.         "IO"    IF    Open()                =    NIL    ,
  20.         "IO"    IF    Fputs()                =    -1
  21.  
  22.  
  23. ->/////////////////////////////////////////////////////////////////////////////
  24. ->/////////////////////////////////////////////////////// CONST ... = ... /////
  25. ->/////////////////////////////////////////////////////////////////////////////
  26. ENUM NAME , OPENED , LASTUSED , VERSION , CHNG , LASTCHANGE , NUMBERFIELDS
  27.  
  28. ENUM    ARG_FD , ARG_NC
  29. ENUM    ARG_NAME , ARG_OC , ARG_LU , ARG_VER , ARG_REV , ARG_CHNG , ARG_LC , ARG_LIB , ARG_DEV ,
  30.         NUMBER_ARGS
  31.  
  32.  
  33. ->/////////////////////////////////////////////////////////////////////////////
  34. ->//////////////////////////////////////////////////////////// OBJECT ... /////
  35. ->/////////////////////////////////////////////////////////////////////////////
  36. EXPORT OBJECT trace
  37.     filename    :    PTR TO CHAR
  38.     first_date    :    PTR TO CHAR
  39.     num_checks    :    LONG
  40.     libraries    :    mlh
  41.     devices        :    mlh
  42. ENDOBJECT
  43.  
  44.  
  45. ->/////////////////////////////////////////////////////////////////////////////
  46. ->/////////////////////////////////////////////////////////// PROC create /////
  47. ->/////////////////////////////////////////////////////////////////////////////
  48. PROC create( filename = NIL ) OF trace
  49.     self.filename := ( IF filename THEN filename ELSE 'PROGDIR:MSFU.trace' )
  50.     self.first_date := current_date()
  51.     newminlist( self.libraries )
  52.     newminlist( self.devices )
  53. ENDPROC
  54.  
  55.  
  56. ->/////////////////////////////////////////////////////////////////////////////
  57. ->///////////////////////////////////////////////////////////// PROC load /////
  58. ->/////////////////////////////////////////////////////////////////////////////
  59. PROC load() OF trace HANDLE
  60.  
  61.     DEF mem = NIL , len
  62.     DEF lines : PTR TO LONG , numlines , i = -1 , line[ 200 ] : STRING
  63.     DEF rd = NIL : PTR TO rdargs , args = NIL : PTR TO LONG
  64.     DEF sf : PTR TO sysfile
  65.  
  66.     mem , len := readfile( self.filename )
  67.     lines := stringsinfile( mem , len , numlines := countstrings( mem , len ) )
  68.  
  69.     rd := AllocDosObject( DOS_RDARGS , NIL )
  70.     NEW args[ NUMBER_ARGS ]
  71.     FOR i := 0 TO ( numlines - 1 )
  72.         args[ ARG_LIB ] := FALSE
  73.         args[ ARG_DEV ] := FALSE
  74.         rd.source.buffer := StrAdd( StrCopy( line , lines[ i ] ) , '\n' )
  75.         rd.source.length := EstrLen( line )
  76.         rd.source.curchr := 0
  77.         rd.dalist := NIL
  78.         rd.buffer := NIL
  79.         rd.bufsiz := 0
  80.         IF i
  81.             ReadArgs( 'NAME,OC/N,LU,VER/N,REV/N,CHNG/N,LC,LIB/S,DEV/S' , args , rd )
  82.             NEW sf
  83.             sf.name := StrCopy( String( StrLen( args[ ARG_NAME ] ) ) , args[ ARG_NAME ] )
  84.             sf.open_count := Long( args[ ARG_OC ] )
  85.             sf.last_used := StrCopy( String( StrLen( args[ ARG_LU ] ) ) , args[ ARG_LU ] )
  86.             sf.vernum := Long( args[ ARG_VER ] )
  87.             sf.revnum := Long( args[ ARG_REV ] )
  88.             sf.changed := Long( args[ ARG_CHNG ] )
  89.             sf.last_change := StrCopy( String( StrLen( args[ ARG_LC ] ) ) , args[ ARG_LC ] )
  90.             AddTail( IF args[ ARG_LIB ] THEN self.libraries ELSE self.devices , sf )
  91.         ELSE
  92.             ReadArgs( 'FD,NC/N' , args , rd )
  93.             self.first_date := StrCopy( String( StrLen( args[ ARG_FD ] ) ) , args[ ARG_FD ] )
  94.             self.num_checks := Long( args[ ARG_NC ] )
  95.         ENDIF
  96.         FreeArgs( rd )
  97.     ENDFOR
  98.  
  99. EXCEPT DO
  100.     IF ( i >= 0 ) AND ( i <= ( numlines - 1 ) ) THEN FreeArgs( rd )
  101.     END args[ NUMBER_ARGS ]
  102.     IF rd THEN FreeDosObject( DOS_RDARGS , rd )
  103.     IF mem THEN freefile( mem )
  104.  
  105.     IF exception = "MEM"
  106.         ReThrow()
  107.     ELSEIF ( exception = "OPEN" ) OR ( exception = "IN" )
  108.         PrintFault( IoErr() , 'Can''t open trace ' )
  109.     ENDIF
  110. ENDPROC
  111.  
  112.  
  113. ->/////////////////////////////////////////////////////////////////////////////
  114. ->///////////////////////////////////////////////////////////// PROC save /////
  115. ->/////////////////////////////////////////////////////////////////////////////
  116. PROC save() OF trace HANDLE
  117.  
  118.     DEF file = NIL , sl[ 100 ] : STRING
  119.  
  120.     file := Open( self.filename , NEWFILE )
  121.     Fputs( file , StringF( sl , '\s \d\n' , self.first_date , self.num_checks ) )
  122.  
  123.     save_sysfiles( file , self.libraries , 'LIB' )
  124.     save_sysfiles( file , self.devices , 'DEV' )
  125.  
  126. EXCEPT DO
  127.     PrintFault( IoErr() , 'Can''t save trace ' )
  128.     IF file THEN Close( file )
  129. ENDPROC
  130.  
  131.  
  132. ->/////////////////////////////////////////////////////////////////////////////
  133. ->/////////////////////////////////////////////////////////// PROC update /////
  134. ->/////////////////////////////////////////////////////////////////////////////
  135. PROC update( libs , devs ) OF trace
  136.  
  137.     DEF list : mlh , eb : execbase
  138.  
  139.     self.num_checks := self.num_checks + 1
  140.     eb := execbase
  141.  
  142.     IF libs
  143.         current_sysfiles( list , eb.liblist )
  144.         mix_sysfiles( list , self.libraries )
  145.     ENDIF
  146.  
  147.     IF devs
  148.         current_sysfiles( list , eb.devicelist )
  149.         mix_sysfiles( list , self.devices )
  150.     ENDIF
  151.  
  152. ENDPROC
  153.  
  154.  
  155. ->/////////////////////////////////////////////////////////////////////////////
  156. ->///////////////////////////////////////////////////////////// PROC sort /////
  157. ->/////////////////////////////////////////////////////////////////////////////
  158. PROC sort() OF trace
  159.     sort_sysfiles( self.libraries )
  160.     sort_sysfiles( self.devices )
  161. ENDPROC
  162.  
  163.  
  164. ->/////////////////////////////////////////////////////////////////////////////
  165. ->//////////////////////////////////////////////////////////// PROC print /////
  166. ->/////////////////////////////////////////////////////////////////////////////
  167. PROC print() OF trace
  168.     PrintF( '\n\d check were done since \s.\n' , self.num_checks , self.first_date )
  169.     print_sysfiles( self.libraries , 'Library name' , self.num_checks )
  170.     print_sysfiles( self.devices , 'Device name' , self.num_checks )
  171. ENDPROC
  172.  
  173.  
  174. ->/////////////////////////////////////////////////////////////////////////////
  175. ->///////////////////////////////////////////////////// PROC current_date /////
  176. ->/////////////////////////////////////////////////////////////////////////////
  177. PROC current_date()
  178.  
  179.     DEF dt : datetime
  180.     DEF str[ 30 ] : ARRAY
  181.  
  182.     DateStamp( dt.stamp )
  183.     dt.format := FORMAT_DOS
  184.     dt.flags := 0
  185.     dt.strday := NIL
  186.     dt.strdate := str
  187.     dt.strtime := NIL
  188.     DateToStr( dt )
  189.  
  190. ENDPROC StrCopy( String( StrLen( str ) ) , str )
  191.  
  192.  
  193. ->/////////////////////////////////////////////////////////////////////////////
  194. ->///////////////////////////////////////////////// PROC current_sysfiles /////
  195. ->/////////////////////////////////////////////////////////////////////////////
  196. PROC current_sysfiles( list : PTR TO mlh , syslist : PTR TO mlh ) HANDLE
  197.  
  198.     DEF sf : PTR TO lib , f : PTR TO sysfile    ->    OBJECT lib = OBJECT dd (see exec/devices)
  199.  
  200.     newminlist( list )
  201.     sf := syslist.head
  202.  
  203.     Forbid()
  204.     Disable()
  205.  
  206.     WHILE sf.ln.succ
  207.         NEW f
  208.         f.name := StrCopy( String( StrLen( sf.ln.name ) ) , sf.ln.name )
  209.         f.open_count := sf.opencnt
  210.         f.vernum := sf.version
  211.         f.revnum := sf.revision
  212.         AddTail( list , f )
  213.         sf := sf.ln.succ
  214.     ENDWHILE
  215.  
  216. EXCEPT DO
  217.  
  218.     Enable()
  219.     Permit()
  220.  
  221.     ReThrow()
  222.  
  223. ENDPROC
  224.  
  225.  
  226. ->/////////////////////////////////////////////////////////////////////////////
  227. ->///////////////////////////////////////////////////// PROC mix_sysfiles /////
  228. ->/////////////////////////////////////////////////////////////////////////////
  229. PROC mix_sysfiles( list1 : PTR TO mlh , list2 : PTR TO mlh )
  230.  
  231.     DEF sf1 : PTR TO sysfile , sf2: PTR TO sysfile
  232.     DEF bool = FALSE
  233.  
  234.     WHILE ( ( sf1 := list1.head ) BUT sf1.succ )
  235.  
  236.         Remove( sf1 )
  237.  
  238.         sf2 := list2.head
  239.         WHILE sf2.succ
  240.             EXIT ( bool := StrCmp( sf1.name , sf2.name ) )
  241.             sf2 := sf2.succ
  242.         ENDWHILE
  243.  
  244.         IF bool
  245.  
  246.             sf2.open_count := sf2.open_count + sf1.open_count
  247.             DisposeLink( sf2.last_used )
  248.             sf2.last_used := current_date()
  249.  
  250.             IF ( sf1.vernum <> sf2.vernum ) OR ( sf1.revnum <> sf2.revnum )
  251.                 sf2.vernum := sf1.vernum
  252.                 sf2.revnum := sf1.revnum
  253.                 sf2.changed := sf2.changed + 1
  254.                 DisposeLink( sf2.last_change )
  255.                 sf2.last_change := current_date()
  256.             ENDIF
  257.  
  258.             DisposeLink( sf1.name )
  259.             END sf1
  260.  
  261.         ELSE
  262.  
  263.             sf1.last_used := current_date()
  264.             sf1.last_change := current_date()
  265.             AddTail( list2 , sf1 )
  266.  
  267.         ENDIF
  268.  
  269.     ENDWHILE
  270.  
  271. ENDPROC
  272.  
  273.  
  274. ->/////////////////////////////////////////////////////////////////////////////
  275. ->//////////////////////////////////////////////////// PROC sort_sysfiles /////
  276. ->/////////////////////////////////////////////////////////////////////////////
  277. PROC sort_sysfiles( list : PTR TO mlh )
  278.  
  279.     DEF tlist : mlh , sf : PTR TO sysfile
  280.     DEF max , msf : PTR TO sysfile
  281.  
  282.     newminlist( tlist )
  283.  
  284.     WHILE ( ( sf := list.head ) BUT sf.succ )
  285.  
  286.         max := -1
  287.         WHILE sf.succ
  288.             IF sf.open_count > max
  289.                 max := sf.open_count
  290.                 msf := sf
  291.             ENDIF
  292.             sf := sf.succ
  293.         ENDWHILE
  294.  
  295.         Remove( msf )
  296.         AddTail( tlist , msf )
  297.  
  298.     ENDWHILE
  299.  
  300.     WHILE ( ( sf := tlist.head ) BUT sf.succ )
  301.         Remove( sf )
  302.         AddTail( list , sf )
  303.     ENDWHILE
  304.  
  305. ENDPROC
  306.  
  307.  
  308. ->/////////////////////////////////////////////////////////////////////////////
  309. ->/////////////////////////////////////////////////// PROC print_sysfiles /////
  310. ->/////////////////////////////////////////////////////////////////////////////
  311. PROC print_sysfiles( list : PTR TO mlh , name , num_checks )
  312.  
  313.     DEF sf : PTR TO sysfile
  314.     DEF formatstr[ 100 ] : STRING , lenf[ NUMBERFIELDS ] : ARRAY
  315.     DEF str1[ 20 ] : STRING , str2[ 20 ] : STRING , str3[ 20 ] : STRING
  316.  
  317.     IF ( ( sf := list.head ) BUT sf.succ )
  318.  
  319.         lenf[ NAME ] := 12
  320.         lenf[ OPENED ] := 6
  321.         lenf[ LASTUSED ] := 9
  322.         lenf[ VERSION ] := 7
  323.         lenf[ CHNG ] := 4
  324.         lenf[ LASTCHANGE ] := 11
  325.         WHILE sf.succ
  326.             lenf[ NAME ] := Max( lenf[ NAME ] , EstrLen( sf.name ) )
  327.             lenf[ OPENED ] := Max( lenf[ OPENED ] , EstrLen( RealF( str1 , sf.open_count!/(num_checks!) , 2 ) ) )
  328.             lenf[ LASTUSED ] := Max( lenf[ LASTUSED ] , EstrLen( sf.last_used ) )
  329.             lenf[ VERSION ] := Max( lenf[ VERSION ] , EstrLen( StringF( str1 , '\d.\d' , sf.vernum , sf.revnum ) ) )
  330.             lenf[ CHNG ] := Max( lenf[ CHNG ] , EstrLen( StringF( str1 , '\d' , sf.changed ) ) )
  331.             lenf[ LASTCHANGE ] := Max( lenf[ LASTCHANGE ] , EstrLen( sf.last_change ) )
  332.             sf := sf.succ
  333.         ENDWHILE
  334.  
  335.         StringF( formatstr , '%-\d.\ds %\d.\ds %\d.\ds %\d.\ds %\d.\ds %\d.\ds\n' ,
  336.                     lenf[ NAME ] , lenf[ NAME ] ,
  337.                     lenf[ OPENED ] , lenf[ OPENED ] ,
  338.                     lenf[ LASTUSED ] , lenf[ LASTUSED ] ,
  339.                     lenf[ VERSION ] , lenf[ VERSION ] ,
  340.                     lenf[ CHNG ] , lenf[ CHNG ] ,
  341.                     lenf[ LASTCHANGE ] , lenf[ LASTCHANGE ] )
  342.  
  343.         PrintF( '\n\c1;33;40\c' , $9B , $6D )
  344.         PrintF( formatstr , name , 'Opened' , 'Last used' , 'Version' , 'Chng' , 'Last change' )
  345.         PrintF( '\c0;31;40\c' , $9B , $6D )
  346.  
  347.         sf := list.head
  348.         WHILE sf.succ
  349.             PrintF(    formatstr ,
  350.                     sf.name ,
  351.                     RealF( str1 , sf.open_count!/(num_checks!) , 2 ) , sf.last_used ,
  352.                     StringF( str2 , '\d.\d' , sf.vernum , sf.revnum ) ,
  353.                     StringF( str3 , '\d' , sf.changed ) , sf.last_change )
  354.             sf := sf.succ
  355.         ENDWHILE
  356.  
  357.     ENDIF
  358.  
  359. ENDPROC
  360.  
  361.  
  362. ->/////////////////////////////////////////////////////////////////////////////
  363. ->//////////////////////////////////////////////////// PROC save_sysfiles /////
  364. ->/////////////////////////////////////////////////////////////////////////////
  365. PROC save_sysfiles( file , list : PTR TO mlh , type )
  366.  
  367.     DEF sf : PTR TO sysfile , sl[ 200 ] : STRING
  368.  
  369.     sf := list.head
  370.     WHILE sf.succ
  371.         Fputs( file ,
  372.             StringF( sl , '"\s" \d "\s" \d \d \d "\s" \s\n' ,
  373.                 sf.name , sf.open_count , sf.last_used ,
  374.                 sf.vernum , sf.revnum , sf.changed , sf.last_change ,
  375.                 type ) )
  376.         sf := sf.succ
  377.     ENDWHILE
  378.  
  379. ENDPROC
  380.